package com.huaxin.hxmoduleworkorder.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.huaxin.hxmoduleworkorder.dto.ResponseResult;
import com.huaxin.hxmoduleworkorder.dto.request.CustomerEvaluationCreateReqDTO;
import com.huaxin.hxmoduleworkorder.dto.request.CustomerEvaluationUpdateReqDTO;
import com.huaxin.hxmoduleworkorder.dto.request.GetCustomerEvaluationPageReqDTO;
import com.huaxin.hxmoduleworkorder.dto.response.GetCustomerEvaluationPageRespDTO;
import com.huaxin.hxmoduleworkorder.models.CustomerEvaluation;

/**
 * 客户评价服务接口
 * <p>
 * 提供对客户评价记录的增删改查及业务操作。
 * 支持根据工单ID查询评价、判断客户是否已评价等业务方法。
 * </p>
 *
 * @author fuai
 * @since 2025-09-02
 */
public interface CustomerEvaluationService extends IService<CustomerEvaluation> {

    /**
     * 新增客户评价
     *
     * @param dto 客户评价请求参数
     * @return 是否保存成功
     */
    ResponseResult<String> addCustomerEvaluation(CustomerEvaluationCreateReqDTO dto);

    /**
     * 更新客户评价（通过ID）
     *
     * @param dto 客户评价更新参数，必须包含ID
     * @return 是否更新成功
     */
    ResponseResult<String> updateCustomerEvaluation(CustomerEvaluationUpdateReqDTO dto);

    /**
     * 删除客户评价（通过ID）
     *
     * @param id 客户评价ID
     * @return 是否删除成功
     */
    ResponseResult<String> deleteCustomerEvaluation(String id);

    /**
     * 根据ID获取客户评价详情
     *
     * @param id 客户评价ID
     * @return 客户评价对象，若无则返回 null
     */

    ResponseResult<CustomerEvaluation> getCustomerEvaluationById(String id);

    /**
     * 根据工单ID获取评价信息
     *
     * @param maintenanceOrderId 工单ID
     * @return 评价信息，若无则返回 null
     */
    ResponseResult<CustomerEvaluation> getEvaluationByOrderId(String maintenanceOrderId);

    /**
     * 判断客户是否已评价
     *
     * @param maintenanceOrderId 工单ID
     * @param customerId         客户ID
     * @return true 表示已评价，false 表示未评价
     */
    boolean hasEvaluated(String maintenanceOrderId, String customerId);

    /**
     * 获取客户评价列表（分页）
     *
     * @param in 分页参数
     * @return 客户评价列表
     */
    ResponseResult<Page<CustomerEvaluation>> getCustomerEvaluationPage(GetCustomerEvaluationPageReqDTO in);

    /**
     * 回复客户评价
     *
     * @param id           评价ID
     * @param replyContent 回复内容
     * @return
     */
    ResponseResult<String> replyCustomerEvaluation(String id, String replyContent);
}